// 登录校验中间件
module.exports = options => {
  // 导入使用第三方模块jsonwebtoken的sign方法来生成token
  const jwt = require('jsonwebtoken')
  // 错误处理中间件(第三方)
  const assert = require('http-assert')
  // 引用用户模型，通过用户名查找用户
  const AdminUser = require('../models/AdminUser')

  return async (req,res,next) => {
    // 服务器端登录校验
    const token = String(req.headers.authorization || '').split(' ').pop()
    // 判断token为空时报错 --请提供jwt token
    assert(token,401,'请先登录')
    // 解密并校验      { id: '607fb8d788c10b5948a2028b', iat: 1618994824 }
    const { id } = jwt.verify(token,req.app.get('secret'))
    // id不存在时报错 -- 无效的jwt token
    assert(id,401,'请先登录')
    // 通过id查找用户并挂载到req上,方便后续使用
    req.user = await AdminUser.findById(id)
    // 用户不存在
    assert(req.user,401,'请先登录')
    await next()
  }
}